Terraform的基本概念

睡睡念

經歷上一篇的失敗,
還是先從基本觀念開始吧。

正文

tf基本組成

下面指令輸入時,會用tf取代terraform

宣告
  1. terraform
    宣告terraform以及環境的版本
terraform {
  required_version = "~>0.13.5"
  required_providers {
    ucloud = {
      source  = "ucloud/ucloud"
      version = "~>1.22.0"
    }
  }
}
  1. provider
    呼叫該環境api時需要的參數
    k8s
provider "kubernetes" {
  config_path = "~/.kube/config"
}

ucloud

provider "ucloud" {
  public_key  = "JInqRnkSY8eAmxKFRxW9kVANYThg1pcvjD2Aw5f5p"
  private_key = "IlJn6GlmanYI1iDVEtrPyt5R9noAGz41B8q5TML7abqD8e4YjVdylwaKWdY61J5TcA"
  project_id  = "org-tgqbvi"
  region      = "cn-bj2"
}

定義
  1. data
    取得terraform以外的資訊,不同的proivder提供不同的data sources。
    provider 列表
data "ucloud_security_groups" "default" {
  type = "recommend_web"
}
  1. resource
    要建立的資源
	resource "ucloud_eip" "web-eip" {
	  internet_type = "bgp"
	  charge_mode   = "bandwidth"
	  charge_type   = "dynamic"
	  name          = "web-eip"
	}
  1. output
    輸出
		output "eip" {
		  value = ucloud_eip.web-eip.public_ip
		} 

狀態檔案(tfstate)

當terrform要執行變更時,會產生tfstate的檔案,
上面記載了目前雲上的資源狀態,此檔案不建議編輯,
當有任何資源變更時,會同步判斷目前雲上的資源狀態是否一致。
可使用以下指令,匯入目前雲端上的資源狀態

 terraform import kubernetes_deployment.websocketclient default/websocketclient

kubernetes_deployment.websocketclient 為tf的資源名稱
default/websocketclient 是雲上的資源

此tfstate的檔案是明碼,且多人使用會造成簽入時發生衝突,
所以要透過backend來解決這個問題

檔案裏面會看到一些狀態,代表的意思如下

148-fig.2.jpg

ref. 使用基礎架構即程式碼工具 Terraform


遠端狀態儲存機制(Backend)

Terraform Remote Backend分為兩種:

目前支援的backend list
148-fig.1.jpg

要共用 backend的話,
先建立一個 backend.hcl
裏面輸入

   bucket  = "98c2c8-terraform-backend"
   prefix  = "terraform/state"

上面的prefix代表的意思為

GCS prefix inside the bucket. Named states for workspaces are stored in an object called <prefix>/<name>.tfstate

在main.tf的required_providers後面填上 backend "gcs" { },
格式如下

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "4.63.1"
    }
  }
  backend "gcs" {

  }
}

然後在初始化的時候,輸入

terraform init -backend-config=backend.hcl

ref.


建立workspace

相比起多資料夾隔離的方式來說,基於Workspace的隔離更加簡單,只需要保存一份程式碼,在程式碼中不需要為Workspace編寫額外程式碼,用命令列就可以在不同工作區之間來回切換。

下列指令分別爲,建立、列表、選擇及顯示目前的workspace

terraform workspace new qa
terraform workspace list
terraform workspace select qa
terraform worspace show

ref. 狀態管理


檢查terraform 的計劃

terraform plan -out=out.tfplan

-out的指定計畫的輸出檔,確保您所檢閱的方案就是所套用的方案。
之後使用apply執行

terraform apply out.tfplan

建立完成後,使用show看目前狀態

terraform show

count

舉例來說, 兩個VM是一隻狗一隻貓,那就是dog.tf cat.tf
如果是兩隻狗 就可以寫一個 dog.tf
裡面用
resources ec2
Count = 2
這樣


console

執行 console ,看程式執行結果

terraform console 

cidrsubnet 後面的第二個參數表示二進位要位移多少,第三個參數表示,要設定位移的數字為多少。

例如 10 = 1010
位移4bit,所以是 1010 0000 = 160
6 = 0110
位移4bit ,所以是 0110 0000 = 96

tf console
> cidrsubnet("10.1.0.0/24",4,0)
"10.1.0.0/28"
> cidrsubnet("10.1.0.0/24",4,10)
"10.1.0.160/28"
> cidrsubnet("10.1.0.0/24",4,6)
"10.1.0.96/28"
> cidrsubnet("10.1.0.0/24",4,12)
"10.1.0.192/28"

ref. How cidrsubnet works in Terraform


variable變數宣告

先知道變數的繼承順序,

種類 描述 範例 優先 建議使用
命令列參數 輸入命令時,指定變數 tf apply -var="gcp_region=asia-east" 1 特殊情況
環境變數 使用 TF_VAR_ 環境變數定義 TF_VAR_gcp_region=asia_east2 2
變數文件 使用tfvars變數文件定義 gcp_region=asia_east2 3 開發者
設定文件 使用variables區塊定義 variable "gcp_region" {default = "asia-east1"} 4 程式碼

tf的變數要先宣告,

variable "gcp_region" {
  default = "asia-east1"
}

如果後續要改值,可以改成

gcp_region = "asia-east2"

如果要測試,可以執行 terraform console
再輸入變數名稱驗證。

變數文件載入方式

必須在同一個tf init的資料夾內。

148-fig.4.jpg

還有其他載入方式,在apply 時載入變數檔,或是環境變數載入。
詳細參考


常用指令